class Set {
    constructor () {
      this.items = {}
    }
    has (element) {
      return element in this.items
    }
    add (element) {
      if (!this.has(element)) {
        this.items[element] = element
        return true
      }
      return false
    }
    delete (element) {
      if (this.has(element)) {
        delete this.items[element]
        return true
      }
      return false
    }
    clear () {
      this.items = {}
    }
    size () {
      return Object.keys(this.items).length
    }
    values () {
      return Object.values(this.items)
    }

    // 并集
    union (otherSet) {
        const unionSet = new Set()
        this.values().forEach(item => {
          unionSet.add(item)
        })
        otherSet.values().forEach(item => {
          unionSet.add(item)
        })
        return unionSet
    }

    // 交集
    // intersection (otherSet) {
    //     const intersectionSet = new Set()
    //     this.values().forEach(item => {
    //       if (otherSet.has(item)) {
    //         intersectionSet.add(item)
    //       }
    //     })
    //     return intersectionSet
    // }

    intersection (otherSet) {
        const intersectionSet = new Set()
        const values = this.values()
        const otherValues = otherSet.values()
        let biggerSet = values
        let smallerSet = otherValues
        if (biggerSet.length - smallerSet.length > 0) {
          biggerSet = otherValues
          smallerSet = values
        }
        smallerSet.forEach(item => {
          if (biggerSet.includes(item)) {
            intersectionSet.add(item)
          }
        })
        return intersectionSet
    }


    // 差集
    difference (otherSet) {
        const differenceSet = new Set()
        this.values.forEach(item => {
          if (!otherSet.has(item)) {
            differenceSet.add(item)
          }
        })
        return differenceSet
    }

    // 子集
    isSubSetOf (otherSet) {
        if (this.size() > otherSet.size()) {
          return false
        }
        let isSubSet = this.values().every(item => {
          return otherSet.has(item)
        })
        return isSubSet
    }
}



// 并集测试
// const setA = new Set()
// setA.add(1)
// setA.add(2)
// setA.add(3)
// const setB = new Set()
// setB.add(4)
// setB.add(5)
// setB.add(6)
// const result = setA.union(setB)
// console.log(result.values()) // [1, 2, 3, 4, 5, 6]

// 交集测试
// const setA = new Set()
// setA.add(1)
// setA.add(2)
// setA.add(3)
// const setB = new Set()
// setB.add(2)
// setB.add(3)
// setB.add(4)
// const result = setA.intersection(setB)
// console.log(result.values()) // [2, 3]


// 差集测试
// const setA = new Set()
// setA.add(1)
// setA.add(2)
// setA.add(3)
// const setB = new Set()
// setB.add(2)
// setB.add(3)
// setB.add(4)
// const result = setA.difference(setB)
// console.log(result.values()) // [1]

// 子集测试
// const setA = new Set()
// setA.add(1)
// setA.add(2)
// const setB = new Set()
// setB.add(1)
// setB.add(2)
// setB.add(3)
// const setC = new Set()
// setB.add(2)
// setB.add(3)
// setB.add(4)
// const result1 = setA.isSubSetOf(setB)
// const result2 = setA.isSubSetOf(setC)
// console.log(result1) // true
// console.log(result2) // false